/*-------------------------------------------------------------------------
 *
 * pg_attribute.h
 *      definition of the system "attribute" relation (pg_attribute)
 *      along with the relation's initial contents.
 *
 *
 * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * This source code file contains modifications made by THL A29 Limited ("Tencent Modifications").
 * All Tencent Modifications are Copyright (C) 2023 THL A29 Limited.
 *
 * src/include/catalog/pg_attribute.h
 *
 * NOTES
 *      the genbki.pl script reads this file and generates .bki
 *      information from the DATA() statements.
 *
 *-------------------------------------------------------------------------
 */
#ifndef PG_ATTRIBUTE_H
#define PG_ATTRIBUTE_H

#include "catalog/genbki.h"

/* ----------------
 *        pg_attribute definition.  cpp turns this into
 *        typedef struct FormData_pg_attribute
 *
 *        If you change the following, make sure you change the structs for
 *        system attributes in catalog/heap.c also.
 *        You may need to change catalog/genbki.pl as well.
 * ----------------
 */
#define AttributeRelationId  1249
#define AttributeRelation_Rowtype_Id  75

CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(75) BKI_SCHEMA_MACRO
{
    Oid            attrelid;        /* OID of relation containing this attribute */
    NameData    attname;        /* name of attribute */

    /*
     * atttypid is the OID of the instance in Catalog Class pg_type that
     * defines the data type of this attribute (e.g. int4).  Information in
     * that instance is redundant with the attlen, attbyval, and attalign
     * attributes of this instance, so they had better match or Postgres will
     * fail.
     */
    Oid            atttypid;

    /*
     * attstattarget is the target number of statistics datapoints to collect
     * during VACUUM ANALYZE of this column.  A zero here indicates that we do
     * not wish to collect any stats about this column. A "-1" here indicates
     * that no value has been explicitly set for this column, so ANALYZE
     * should use the default setting.
     */
    int32        attstattarget;

    /*
     * attlen is a copy of the typlen field from pg_type for this attribute.
     * See atttypid comments above.
     */
    int16        attlen;

    /*
     * attnum is the "attribute number" for the attribute:    A value that
     * uniquely identifies this attribute within its class. For user
     * attributes, Attribute numbers are greater than 0 and not greater than
     * the number of attributes in the class. I.e. if the Class pg_class says
     * that Class XYZ has 10 attributes, then the user attribute numbers in
     * Class pg_attribute must be 1-10.
     *
     * System attributes have attribute numbers less than 0 that are unique
     * within the class, but not constrained to any particular range.
     *
     * Note that (attnum - 1) is often used as the index to an array.
     */
    int16        attnum;

    /*
     * attndims is the declared number of dimensions, if an array type,
     * otherwise zero.
     */
    int32        attndims;

    /*
     * fastgetattr() uses attcacheoff to cache byte offsets of attributes in
     * heap tuples.  The value actually stored in pg_attribute (-1) indicates
     * no cached value.  But when we copy these tuples into a tuple
     * descriptor, we may then update attcacheoff in the copies. This speeds
     * up the attribute walking process.
     */
    int32        attcacheoff;

    /*
     * atttypmod records type-specific data supplied at table creation time
     * (for example, the max length of a varchar field).  It is passed to
     * type-specific input and output functions as the third argument. The
     * value will generally be -1 for types that do not need typmod.
     */
    int32        atttypmod;

    /*
     * attbyval is a copy of the typbyval field from pg_type for this
     * attribute.  See atttypid comments above.
     */
    bool        attbyval;

    /*----------
     * attstorage tells for VARLENA attributes, what the heap access
     * methods can do to it if a given tuple doesn't fit into a page.
     * Possible values are
     *        'p': Value must be stored plain always
     *        'e': Value can be stored in "secondary" relation (if relation
     *             has one, see pg_class.reltoastrelid)
     *        'm': Value can be stored compressed inline
     *        'x': Value can be stored compressed inline or in "secondary"
     * Note that 'm' fields can also be moved out to secondary storage,
     * but only as a last resort ('e' and 'x' fields are moved first).
     *----------
     */
    char        attstorage;

    /*
     * attalign is a copy of the typalign field from pg_type for this
     * attribute.  See atttypid comments above.
     */
    char        attalign;

    /* This flag represents the "NOT NULL" constraint */
    bool        attnotnull;

    /* Has DEFAULT value or not */
    bool        atthasdef;
    
    /* _MLS_ */
    /* Has a missing value or not */
    bool        atthasmissing;

    /* One of the ATTRIBUTE_IDENTITY_* constants below, or '\0' */
    char        attidentity;

    /* Is dropped (ie, logically invisible) or not */
    bool        attisdropped;

    /*
     * This flag specifies whether this column has ever had a local
     * definition.  It is set for normal non-inherited columns, but also for
     * columns that are inherited from parents if also explicitly listed in
     * CREATE TABLE INHERITS.  It is also set when inheritance is removed from
     * a table with ALTER TABLE NO INHERIT.  If the flag is set, the column is
     * not dropped by a parent's DROP COLUMN even if this causes the column's
     * attinhcount to become zero.
     */
    bool        attislocal;

    /* Number of times inherited from direct parent relation(s) */
    int32        attinhcount;

    /* attribute's collation */
    Oid            attcollation;

#ifdef CATALOG_VARLEN            /* variable-length fields start here */
    /* NOTE: The following fields are not present in tuple descriptors. */

    /* Column-level access permissions */
    aclitem        attacl[1];

    /* Column-level options */
    text        attoptions[1];

    /* Column-level FDW options */
    text        attfdwoptions[1];
    /*
     * Missing value for added columns. This is a one element array which lets
     * us store a value of the attribute type here.
     */
    anyarray    attmissingval;
#endif
} FormData_pg_attribute;

/*
 * ATTRIBUTE_FIXED_PART_SIZE is the size of the fixed-layout,
 * guaranteed-not-null part of a pg_attribute row.  This is in fact as much
 * of the row as gets copied into tuple descriptors, so don't expect you
 * can access fields beyond attcollation except in a real tuple!
 */
#define ATTRIBUTE_FIXED_PART_SIZE \
    (offsetof(FormData_pg_attribute,attcollation) + sizeof(Oid))

/* ----------------
 *        Form_pg_attribute corresponds to a pointer to a tuple with
 *        the format of pg_attribute relation.
 * ----------------
 */
typedef FormData_pg_attribute *Form_pg_attribute;

/* ----------------
 *        compiler constants for pg_attribute
 * ----------------
 */

#define Natts_pg_attribute                24
#define Anum_pg_attribute_attrelid        1
#define Anum_pg_attribute_attname        2
#define Anum_pg_attribute_atttypid        3
#define Anum_pg_attribute_attstattarget 4
#define Anum_pg_attribute_attlen        5
#define Anum_pg_attribute_attnum        6
#define Anum_pg_attribute_attndims        7
#define Anum_pg_attribute_attcacheoff    8
#define Anum_pg_attribute_atttypmod        9
#define Anum_pg_attribute_attbyval        10
#define Anum_pg_attribute_attstorage    11
#define Anum_pg_attribute_attalign        12
#define Anum_pg_attribute_attnotnull    13
#define Anum_pg_attribute_atthasdef        14
#define Anum_pg_attribute_atthasmissing 15
#define Anum_pg_attribute_attidentity   16
#define Anum_pg_attribute_attisdropped  17
#define Anum_pg_attribute_attislocal    18
#define Anum_pg_attribute_attinhcount   19
#define Anum_pg_attribute_attcollation  20
#define Anum_pg_attribute_attacl        21
#define Anum_pg_attribute_attoptions    22
#define Anum_pg_attribute_attfdwoptions 23
#define Anum_pg_attribute_attmissingval 24


/* ----------------
 *        initial contents of pg_attribute
 *
 * The initial contents of pg_attribute are generated at compile time by
 * genbki.pl.  Only "bootstrapped" relations need be included.
 * ----------------
 */


#define          ATTRIBUTE_IDENTITY_ALWAYS        'a'
#define          ATTRIBUTE_IDENTITY_BY_DEFAULT 'd'

#endif                            /* PG_ATTRIBUTE_H */
